package ctrLayer;
import modelLayer.*;

import java.util.ArrayList;

/**
 * Aftale controlleren er mellemledet mellem UI-laget og modellaget, som
 * holder styr på aftale-objektet, mens der bliver angivet værdier i UI.
 * 
 * @author (Gruppe 2. Jonas, Danny, Kasper, Bruno & Jesper) 
 * @version (17/12-2012)
 */
public class AftaleCtr
{
    private static AftaleContainer aftaleContainer;
    private PersonCtr personCtr;
    private VareCtr vareCtr;
    
    private Aftale aftale;
    private DelOrdre delOrdre;
    
    /**
     * Aftale konstruktør
     */
    public AftaleCtr()
    {
        aftaleContainer = aftaleContainer.getInstance();
        personCtr = new PersonCtr();
        vareCtr = new VareCtr();
    }
    
    /**
     * Opretter en tom aftale.
     * 
     * @param   type    Typen på aftalen der skal oprettes.
     */
    public void opretAftale(AftaleType type)
    {
        if (type == AftaleType.ORDRE)
        {
            aftale = new Ordre("", null, null);    
        }
        else if(type == AftaleType.UDLAAN)
        {
            aftale = new Udlaan("", null, null, -1);
        }
    }
    
    /**
     * Binder en person, som er kunde, til aftalen.
     * 
     * @param   tlf     Telefon nr. på personen.
     * @throws  IllegalStateException   Personen er ikke en kunde.
     * @throws  NullPointerException    Kunden findes ikke.
     */
    public void findOgSetKunde(String tlf) throws Exception
    {
        // Find person ud fra telefon nr.
        Person p = personCtr.findPerson(tlf);
        
        // Undersøg om kunden blev fundet.
        if (p != null)
        {
            // Undersøg om personen er en kunde.
            if (p.getKunde() != null)
            {
                aftale.setKunde(p);
            }
            else
            {
                throw new IllegalStateException("Personen er ikke en kunde!");
            }
        }
        else
        {
            throw new NullPointerException("Kunden findes ikke!");
        }
    }
    
    /**
     * Finder én vare, og tilføjer den til en delordre, som så bliver tilføjet til aftalen.
     * 
     * @param   type    Typen på varen.
     * @param   antal   Antal varer.
     * @throws  NullPointerException        Varen findes ikke.
     * @throws  IllegalArgumentException    Vare antal er under 1.
     */
    public void findOgAddVare(String type, int antal) throws Exception
    {
        // Undersøg om antal er større end 0.
        if (antal < 1)
            throw new IllegalArgumentException("Vare antal skal være 1 eller derover.");
            
        // Find vare.
        Vare v = vareCtr.findVare(type);
        if (v == null)
            throw new NullPointerException("Varen blev ikke fundet.");
        
        // Opret delordre og associer til varen.
        delOrdre = new DelOrdre(v, antal);
        // Tilføj delordre til aftalen.
        aftale.tilfoejDelOrdre(delOrdre);
    }
    
    /**
     * Henter alle delordrerne.
     * 
     * @return  Returnerer alle delordrene der er hæftet til aftalen.
     */
    public ArrayList<DelOrdre> getDelOrdrer()
    {
        return aftale.getDelOrdrer();
    }
    
    /**
     * Tilføjer aftalen til containeren.
     */
    public void tilfoejAftale()
    {
        aftaleContainer.tilfoejAftale(aftale);
    }
}
